package com.hxzy.handler;

import com.hxzy.exceptions.MyException;
import com.hxzy.pojo.Result;
import org.springframework.dao.DataAccessException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * @author wzm
 * @create 2024-03-11 16:01
 * project_name:JavaWeb2401
 * @Description
 */
//定义全局异常处理器 当处理器出现异常时捕获返回统一的错误结果
@RestControllerAdvice   //可以表示为全局异常处理器 并返回json数据  = @ControllerAdvice+@ResponseBody
public class GlobalExceptionHandler {
    //在该类中 定义处理各种错误的处理器方法
    @ExceptionHandler(Exception.class) //标记方法是一个异常处理器  指定此方法要处理的异常类型
    public Result handler(Exception e){
        e.printStackTrace();//打印错误的堆栈信息

        //如果出现了异常 响应一个标准的异常Result对象
        return Result.error("系统异常，请联系管理员");
    }

    //处理器方法可以有多个  执行顺序是从小的异常类型来找 找不到 最后会执行最大的异常
    @ExceptionHandler(ArithmeticException.class)
    public Result handler(ArithmeticException e){
        e.printStackTrace();
        return Result.error("不好意思，发生了数学异常，请检查是不是除数为0！！");
    }


    //处理部门主键重复
    @ExceptionHandler(DataAccessException.class)  //数据库交给了mybatis 很多异常具体的处理不能够直接识别  不像空指针
    public Result handler(SQLIntegrityConstraintViolationException e){
        e.printStackTrace();
        String message = e.getMessage();//Duplicate entry '法务部' for key 'dept.name'
        if(message.contains("Duplicate entry")){
            String[] s = message.split(" ");
            return Result.error("数据已经存在:"+s[2]+"，请勿重复添加！");
        }else {
            return Result.error("数据重复，存在其他sql错误");
        }
    }


    //出现了自定异常
    @ExceptionHandler(MyException.class)
    public Result handler(MyException e){
        e.printStackTrace();
        return Result.error(e.getMessage());
    }

}
